]> git.r.bdr.sh - rbdr/super-polarity/blobdiff - Super Polarity/InputController.cs
Chubas's House happened.
[rbdr/super-polarity] / Super Polarity / InputController.cs
diff --git a/Super Polarity/InputController.cs b/Super Polarity/InputController.cs
new file mode 100644 (file)
index 0000000..405b3ab
--- /dev/null
@@ -0,0 +1,118 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.Xna.Framework.Input;
+
+namespace SuperPolarity
+{
+    static class InputController
+    {
+        static Dictionary<string, List<Action<float>>> Listeners;
+        static Dictionary<string, List<Keys>> RegisteredKeys;
+        static Dictionary<string, List<Buttons>> RegisteredButtons;
+
+        static GamePadState InputGamePadState;
+        static KeyboardState InputKeyboardState;
+
+        /*
+         * Registered Events.
+         * 
+         * You register: name of the event (ie. attack) and a key associated with it.
+         * or button... Left Stick /always/ dispatches move event.
+         */
+
+        static InputController()
+        {
+            Listeners = new Dictionary<string,List<Action<float>>>();
+            InputKeyboardState = new KeyboardState();
+            InputGamePadState = new GamePadState();
+        }
+
+        public static void UpdateInput()
+        {
+            Poll();
+            DispatchMoveEvents();
+            DispatchRegisteredEvents();
+        }
+
+        private static void Poll()
+        {
+            InputGamePadState = GamePad.GetState(Microsoft.Xna.Framework.PlayerIndex.One);
+            InputKeyboardState = Keyboard.GetState();
+        }
+
+        private static void DispatchRegisteredEvents()
+        {
+        }
+
+        private static void DispatchMoveEvents()
+        {
+            float xMovement = 0.0f;
+            float yMovement = 0.0f;
+            // Dispatch the moveX / MoveY events every frame.
+
+            xMovement = InputGamePadState.ThumbSticks.Left.X;
+            yMovement = -InputGamePadState.ThumbSticks.Left.Y;
+
+            Console.WriteLine("Dispatching Input {0}", InputKeyboardState.IsKeyDown(Keys.Left));
+
+            if (InputKeyboardState.IsKeyDown(Keys.Left))
+            {
+                xMovement = -1.0f;
+            }
+
+            if (InputKeyboardState.IsKeyDown(Keys.Right))
+            {
+                xMovement = 1.0f;
+            }
+
+            if (InputKeyboardState.IsKeyDown(Keys.Up))
+            {
+                yMovement = -1.0f;
+            }
+
+            if (InputKeyboardState.IsKeyDown(Keys.Down))
+            {
+                yMovement = 1.0f;
+            }
+
+            Dispatch("moveX", xMovement);
+            Dispatch("moveY", yMovement);
+        }
+
+        public static void Bind(string eventName, Action<float> listener)
+        {
+            List<Action<float>> newListenerList;
+            List<Action<float>> listenerList;
+            bool               foundListeners;
+
+            if (!Listeners.ContainsKey(eventName)) {
+               newListenerList = new List<Action<float>>();
+               Listeners.Add(eventName, newListenerList);
+            }
+
+            foundListeners = Listeners.TryGetValue(eventName, out listenerList);
+
+            listenerList.Add(listener);
+        }
+
+        public static void Dispatch(string eventName, float value)
+        {
+            List<Action<float>> listenerList;
+            bool foundListeners;
+
+            foundListeners = Listeners.TryGetValue(eventName, out listenerList);
+
+            if (!foundListeners)
+            {
+                return;
+            }
+
+            foreach (Action<float> method in listenerList)
+            {
+                method(value);
+            }
+        }
+    }
+}